#include <iostream>
#include <assert.h>
#include <string.h>
#include <stdbool.h>
//展开命名空间
using namespace std;
namespace wanghao
{
    class string
    {
    public:
        //迭代器
        //typedef char* iterator;
        //也可以用using
        using iterator = char*;
        //const_iterator迭代器
        //typedef const char* const_iterator;
        using const_iterator = const char*;
        //无参构造
        //string();
        //带参构造
        string(const char* str = "");
        //析构函数
        ~string();
        //返回底层的指针
        const char* c_str() const;
        //返回size
        size_t size() const;
        //返回capacity
        size_t capacity() const;
        //遍历
        //下标+[]遍历 const
        const char& operator[](size_t i) const;
        //下标+[]遍历
        char& operator[](size_t i);
        //begin返回开始的位置 - 左闭
        iterator begin();
        //end返回结束位置的下一个位置 - 右开
        iterator end();
        //const迭代器begin
        const_iterator begin() const;
        //const迭代器end
        const_iterator end() const;
        //扩容
        void reserve(size_t n);
        //尾插一个字符
        void push_back(char c);
        //尾插一个字符串
        void append(const char* str);
        //+=一个字符
        string& operator+=(char c);
        //+=一个字符串
        string& operator+=(const char* str);
        //pos位置插入一个字符
        void insert(size_t pos,char c);
        //pos位置插入一个字符串
        void insert(size_t pos,const char* str);
        //从pos位置开始删除len个字符
        void erase(size_t pos,size_t len = npos);
        //从pos位置开始查找字符
        size_t find(char ch,size_t pos = 0);
        //从pos位置开始查找字符串
        size_t find(const char* str,size_t pos = 0);
        //取子串
        string substr(size_t pos,size_t len = npos);
        //拷贝构造
        string(const string& s);
        //赋值构造
        string& operator=(const string& s);
        //交换函数
        void swap(string& s);
        //清空
        void clear();
    private:
        char* _str;
        size_t _capacity;
        size_t _size;
    public:
        //C++对整型的一种特殊处理
        //static const size_t npos = -1;
        static const size_t npos;
    };
    //类交换函数
    void swap(string& s1,string& s2);
    //字符串比较函数
    int StrCmp(const char* s1,const char* s2);
    //==
    bool operator==(const string& lhs,const string& rhs);
    //!=
    bool operator!=(const string& lhs,const string& rhs);
    //>
    bool operator>(const string& lhs,const string& rhs);
    //<
    bool operator<(const string& lhs,const string& rhs);
    //>=
    bool operator>=(const string& lhs,const string& rhs);
    //<=
    bool operator<=(const string& lhs,const string& rhs);
    //流插入
    ostream& operator<<(ostream& out,const string& str);
    //流提取
    istream& operator>>(istream& in,string& str);
    //getline
    istream& getline(istream& in,string& str,char delim = '\n');
}
